-- TD 4.3.2 Sink Connect DRP Test

-- 初始化部分
baselib.report(0x00, "TD4.3.2 beginning.")   -- report:第一个参数是上报的消息的MsgType字段,第二个参数是content内容
busilib.ResetOutputs()                       -- 恢复到脚本执行前的初始状态
-- 过压保护
busilib.SetProtecter(ADC.VBUS, 3900, 8, 0x40021018, 0x0100, 0)      -- 6V SW.VBUS_GEN GPIOE.8
busilib.SetProtecter(ADC.CC1, 12000, 8, 0x40020418, 0x4000, 0)      -- 5.5V SW.VCONN_GEN GPIOB.14
busilib.SetProtecter(ADC.CC2, 12000, 8, 0x40020418, 0x4000, 0)      -- 5.5V SW.VCONN_GEN GPIOB.14
busilib.setUsbCable(1, 1)  -- 第二个参数设置为1表示测试仪需要模拟电缆
tcpclib.Reinit(1, 0)       -- 重新初始化 TCPC
-- 设备启动时默认状态就是Disable.SRC
busilib.setUsbCcs(1, CCS.Disabled)            
busilib.setUsbRole(1, ROLE.Source)  

--[[ newMonitor(监控器): 阈值是200和1600(mV), 小于200监控器状态是0, 200-1600状态是1, 大于1600状态是2
第一个参数是监控方式,CHECK_POINT是检查点方式; 第二个参数是监控器序号, 0和1是内置监控器, 0代表对CC1监控, 1代表对CC2监控; 
第三个参数是要监控的状态, 这里填2代表要监控CC是否有大于1600mV的电压, 第四、五个参数分别是最短时间列表和最长时间列表,这里和时间没关系写{0} ]]
-- 为第4步监控CC1和CC2电压做准备
local monitor1 = busilib.newMonitor(TMD.CHECK_POINT, 0, {2}, {0}, {0})     -- 监测CC1是否有超过1600mV
local monitor2 = busilib.newMonitor(TMD.CHECK_POINT, 1, {2}, {0}, {0})     -- 监测CC2是否有超过1600mV

-- 第一步:CVS转换到Unattached.SRC状态 for 5ms    (原文:CVS transitions to Unattached.SRC for 5ms)
busilib.setUsbCcs(1, CCS.Unattached) -- 设置为Unattached.SRC
baselib.report(0x00, "步骤1: CVS 转换到 Unattached.SRC 状态, 维持5ms.") 
baselib.delay(5)                     -- 维持5ms
-- 第二步:CVS转换到Unattached.SNK状态 for 30ms  (原文:CVS transitions to Unattached.SNK for 30ms)
busilib.setUsbRole(1, ROLE.Sink)        --设置为Unattached.SNK,这里本来就是Unattached.SRC,所以省略:busilib.setUsbCcs(CCS.Unattached)
baselib.report(0x00, "步骤2: CVS 转换到 Unattached.SNK 状态, 维持30ms.") 
baselib.delay(30)                    --维持30ms
-- 第三步:CVS转换到Unattached.SRC状态     (原文:CVS transitions to Unattached.SRC)
busilib.setUsbRole(1, ROLE.Source)   
baselib.report(0x00, "步骤3: CVS 转换到 Unattached.SRC 状态, 维持5ms.")    
baselib.delay(5)       

--[[ 第四步: CVS需要验证在1-3步和之后tCCDebounce时间内PUT在CC线上加载Rd [检查点TD.4.3.2.V.1]   
(原文:CVS verifies PUT continued to provide Rd on the CC pin for the duration of steps 1-3 and for tCCDebounce after [TD.4.3.2.V.1]
For a PUT_R, verify this for both CC pins) ]]
baselib.delay(200)       -- tCCDebounce为100ms, 这段代码执行结束刚好1-3步的时间加上tCCDebounce
-- getMonitorResult返回监控器结果, 上面的监控器对状态2(大于1600mV)监控, 如果出现状态2结果就返回1, 所以如果结果是1, 检查点fail
if Captive_Cable then
    if busilib.getMonitorResult(monitor1) ~= 1 and busilib.getMonitorResult(monitor2) ~= 1 then
        baselib.report(0x00, "步骤4: PUT是PUT_R, 两个CC端口没有超过1600mV, TD.4.3.2.V.1 pass.")
    else
        baselib.report(0x00, "步骤4: PUT是PUT_R, 有CC端口超过1600mV, TD.4.3.2.V.1 fail.")
    end
else
    if busilib.getMonitorResult(monitor1) ~= 1 then
        baselib.report(0x00, "步骤4: CC1没有超过1600mV, TD4.3.2.V.1 pass.")
    else
        baselib.report(0x00, "步骤4: CC1超过1600mV, TD4.3.2.V.1 fail.")
    end
end
-- 删除监控器
busilib.deleteMonitor(monitor1)
busilib.deleteMonitor(monitor2)

-- 第五步: CVS转换到Attached.SRC状态     (原文:CVS transitions to Attached.SRC)
busilib.preparePower(1, 1, 5000)    -- 准备VBus电压:5V, 第一个参数是USB端口, 第二个参数中0代表VConn;1代表VBus, 第三个参数是电压值
busilib.setUsbCcs(1, CCS.Attached)  -- 这里会打开上一步准备的VBus
baselib.report(0x00, "步骤5: CVS 转换到 Attached.SRC 状态.")    

--[[ busilib.newTrans4ad(debounce, adc_channel, thresholds)功能: 新建一个状态翻译器。
参数: debounce:采样并去抖次数   adc_channel:要翻译的 ADC 通道。  thresholds:阈值列表,状态数量为阈值数量加一,长度最大为 254。返回值:trans_id:新建的状态翻译器 ID ]]
local trans1 = busilib.newTrans4ad(4, ADC.CC2, {2750})
local monitor3 = busilib.newMonitor(TMD.CHECK_POINT, trans1, {1}, {0}, {0})  -- 此处为6.d步做准备
-- 第六步: CVS验证PUT转换到Attached.SNK   (原文:CVS verifies that PUT transitions to Attached.SNK)
--[[ 6.a步: 在500ms内监测VBUS电流, 电流数值可以是20ms内的平均值, 判别不超过500mA(对应tester宣传的500mA供电能力), 电流监控结果作为TD.4.3.2.V.2检查点进行上报。          
(原文:PUT sinks current according to CVS advertisement [TD.4.3.2.V.2]) ]]
--[[ busilib.waitCondition4ad(adc_channel,debonce,lower_limit,upper_limit,times,timeout) 功能: 阻塞脚本,等待某条件达成。
参数: adc_channel: 要监控的 ADC 通道   debounce: 采样并去抖次数   lower_limit: 目标条件值下限  upper_limit: 目标条件值上限  times: 目标需要的达成次数   timeout: 超时时间,单位为毫秒
返回值: 返回 LuaOk 表示在超时时间内达成目标条件,返回 LuaTimeout 表示超时 ]]
if busilib.waitCondition4ad(ADC.VBUS_I, 20, 500, 5000, 1, 500) == LuaOk then
    baselib.report(0x00, "步骤6.a: VBUS_I出现超过tester宣传的500mA供电能力的电流, TD.4.3.2.V.2 fail.")     --出现 LuaOK 说明有大于500mA的电流出现了一次,检查点fail
else
    baselib.report(0x00, "步骤6.a: VBUS_I没有出现超过tester宣传的500mA供电能力的电流, TD.4.3.2.V.2 pass.")
end

-- 6.d步: 对于PUT_R, 检查CC2电压不超过2.75V, 将测量结果上报为TD.4.3.2.V.5    (原文:For a PUT_R, VCONN is not applied [TD.4.3.2.V.5] )
if Captive_Cable then
    if busilib.getMonitorResult(monitor3) ~= 1 then   -- 出现1就是超过2750mV, 否则检查点pass
        baselib.report(0x00, "步骤6.d: PUT为PUT_R, 检测到CC2电压没有超过2750mV, TD.4.3.2.V.5 pass.")
    else
        baselib.report(0x00, "步骤6.d: PUT为PUT_R, 检测到CC2电压超过2750mV, TD.4.3.2.V.5 fail.")
    end
end
busilib.deleteMonitor(monitor3)   -- 删除监控器
busilib.deleteTrans(trans1)

-- 第七步: CVS转换到Disabled.SRC状态     (原文:CVS transitions to Disabled.SRC)
busilib.setUsbCcs(1, CCS.Disabled)
baselib.report(0x00, "步骤7: CVS 转换到 Disabled.SRC 状态.") 

-- 第八步: CVS验证PUT在tVBUSOFF过期前转换到Unattached.SNK状态      (原文:CVS verifies that PUT transitions to Unattached.SNK before tVBUSOFF expires)
baselib.delay(650)        -- tVBUSOFF为650ms
-- 8.b: 测量VBUS电压,是否小于0.8v, 将测量结果上报为TD.4.3.2.V.7    (原文:b.PUT is not sourcing Vbus (Vbus is at vSafe0V) [TD.4.3.2.V.7]) 
--[[ busilib.GetADC(Integer adc_channel, Integer mean_times)  功能: 获取 ADC 某通道的采样值
参数: adc_channel: 要获取的 ADC 通道  mean_times: 采样并平均次数, 范围为 1 ~ 255 ]]
local VBUS = busilib.GetADC(ADC.VBUS, 4) 
baselib.report(0x00, "读取的VBUS值为" .. VBUS .. "mV.")
if VBUS < 800 then
    baselib.report(0x00, "步骤8.b: 检测到VBUS在vSafe0V, TD.4.3.2.V.7 pass.")
else
    baselib.report(0x00, "步骤8.b: 检测到VBUS大于800mV, TD.4.3.2.V.7 fail.")
end
-- 8.c: 测量CC2, 电压不超过2.75V, 将测量结果上报为TD.4.3.2.V.8     (原文: c.PUT is not sourcing Vconn [TD.4.3.2.V.8])
local VCC2 = busilib.GetADC(ADC.CC2, 4)
baselib.report(0x00, "读取到的 CC2 电压值为" .. VCC2 .. "mV.")
if VCC2 > 2750 then
    baselib.report(0x00, "步骤8.c: CC2电压大于2750mV, TD4.3.2.V.8 fail.")
else
    baselib.report(0x00, "步骤8.c: CC2电压没有超过2750mV, TD4.3.2.V.8 pass.")
end

-- 上报脚本运行完毕
baselib.report(0x00, "脚本 TD4.3.2 Sink Connect DRP Test 运行完毕.")
baselib.report(0x07, "\x04")
